from PIL import Image, ImageDraw, ImageFont

def add_img_watermark(input_file_path, output_file_path, watermark_text):
    """
    在图片上添加水印，并保存输出图片。

    :param input_file_path: 输入图片路径
    :param output_file_path: 输出图片路径
    :param watermark_text: 水印文本
    """
    try:
        # 打开输入的图片
        image = Image.open(input_file_path)
    except Exception as e:
        print(f"无法打开图片: {e}")
        return

    # 创建可以在图片上绘制的对象
    draw = ImageDraw.Draw(image)

    # 设置水印字体
    try:
        font = ImageFont.truetype("simkai.ttf", 36)  # 可更换为其他字体
    except IOError:
        # 如果没有找到字体文件，使用默认字体
        font = ImageFont.load_default()

    # 获取水印文本的尺寸
    bbox = draw.textbbox((0, 0), watermark_text, font=font)
    text_width = bbox[2] - bbox[0]  # 计算文本的宽度
    text_height = bbox[3] - bbox[1]  # 计算文本的高度
    # 获取图片的宽高
    width, height = image.size

    # 计算水平和垂直方向上需要绘制多少个水印
    x = 0
    y = 0

    # 旋转角度
    angle = 45
    # 修改间隔的大小
    horizontal_spacing = 80  # 水平间距增加
    vertical_spacing = 80    # 垂直间距增加

    while y < height:
        while x < width:
            # 创建一个水印图层并进行旋转
            watermark = Image.new("RGBA", (text_width, text_height), (0, 0, 0, 0))
            watermark_draw = ImageDraw.Draw(watermark)
            watermark_draw.text((0, 0), watermark_text, font=font, fill=(169, 169, 169, 128))
            # 旋转水印
            rotated_watermark = watermark.rotate(angle, expand=1)

            # 将旋转后的水印粘贴到原图上
            image.paste(rotated_watermark, (x, y), rotated_watermark)

            # 向右移动
            x += rotated_watermark.size[0] + horizontal_spacing  # 水平间距
        x = 0  # 重置水平位置
        y += rotated_watermark.size[1] + vertical_spacing  # 垂直间距


# 保存加了水印的图片
    try:
        image.save(output_file_path)
        print(f"带水印的图片已保存到: {output_file_path}")
    except Exception as e:
        print(f"保存图片时出错: {e}")

if __name__ == '__main__':
    input_file_path = "E:\\test\\a\\a.jpg"  # 输入图像路径
    output_file_path = "E:\\test\\b\\a.jpg"  # 输出图像路径
    watermark_text = "A啊"  # 水印文本

    add_img_watermark(input_file_path, output_file_path, watermark_text)